/* 
 * File:   Knot.cpp
 * Author: vicror
 * 
 * Created on October 9, 2011, 11:25 PM
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files
 * (the "Software"), to deal in the Software without restriction,
 * including without limitation the rights to use, copy, modify, merge,
 * publish, distribute, sublicense, and/or sell copies of the Software,
 * and to permit persons to whom the Software is furnished to do so,
 * subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

#include "Knot.h"
#include <algorithm>

namespace SearchEnginer {

    Knot::Knot():Basic_Knot() {
        listItem.clear();
    }

    Knot::Knot(const Knot& orig):Basic_Knot(orig) {
        copy(orig);
    }

    Knot::~Knot() {
    }

    template <class t>
    inline t max(t a, t b) {
        return a>b?a:b;
    }

    int Knot::andKnot(const Knot& orig, int mix) {
        ListItemT temp;
        temp.reserve(max(listItem.size(), orig.listItem.size()));
        ListItemTConstIter home  = listItem.begin();
        ListItemTConstIter ghost = orig.listItem.begin();
        while (home != listItem.end() && ghost != orig.listItem.end()) {
            if (home->isEqualWithMix(*ghost, mix)) {
                temp.push_back(*ghost);
                ++ghost;
                ++home;
            } else {
                if ((*home) >= (*ghost)) {
                    ++ghost;
                } else {
                    ++home;
                }
            }
        }
        listItem.clear();
        listItem.reserve(temp.size());
        listItem = temp;
        return listItem.size();
    }


}


